/* * GPL v3 */ package Bricklink.BrickBuilder.api; import java.io.File; import java.io.IOException; import java.security.KeyManagementException; import java.security.KeyStoreException; import java.security.NoSuchAlgorithmException; import java.util.LinkedList; import java.util.List; import javax.net.ssl.SSLContext; import org.apache.http.NameValuePair; import org.apache.http.client.methods.CloseableHttpResponse; import org.apache.http.client.methods.HttpGet; import org.apache.http.client.methods.HttpPost; import org.apache.http.client.methods.HttpPut; import org.apache.http.client.methods.HttpRequestBase; import org.apache.http.conn.ssl.SSLConnectionSocketFactory; import org.apache.http.conn.ssl.SSLContexts; import org.apache.http.entity.mime.MultipartEntity; import org.apache.http.entity.mime.MultipartEntityBuilder; import org.apache.http.entity.mime.content.FileBody; import org.apache.http.impl.client.CloseableHttpClient; import org.apache.http.impl.client.HttpClients; import org.apache.http.message.BasicNameValuePair; import Bricklink.org.kleini.bricklink.api.Parameter; import Bricklink.org.kleini.bricklink.api.Parser; import Bricklink.org.kleini.bricklink.api.Request; import Bricklink.org.kleini.bricklink.api.Response; import Bricklink.org.kleini.bricklink.api.TrustAllStrategy; /** * {@link BrickBuilderClient} * * @author <a href="mailto:himself@kleini.org">Marcus Klein</a> */ public final class BrickBuilderClient { private static final String BASE_URL = "http://ec2-54-255-178-245.ap-southeast-1.compute.amazonaws.com"; private final CloseableHttpClient client; public BrickBuilderClient() throws KeyManagementException, NoSuchAlgorithmException, KeyStoreException { super(); SSLContext sslcontext = SSLContexts.custom() .loadTrustMaterial(null, new TrustAllStrategy()).build(); SSLConnectionSocketFactory sslsf = new SSLConnectionSocketFactory( sslcontext, new String[] { "TLSv1" }, null, SSLConnectionSocketFactory.BROWSER_COMPATIBLE_HOSTNAME_VERIFIER); client = HttpClients.custom().setSSLSocketFactory(sslsf).build(); } public <T extends Response<?>> T execute(Request<T> request) throws Exception { String url = BASE_URL + request.getPath(); HttpRequestBase httpRequest = null; switch (request.getRequestType()) { case GET: httpRequest = new HttpGet(url); addParams2Header(httpRequest, getGETParameter(request)); break; case PUT: httpRequest = new HttpPut(url); addParams2Header(httpRequest, getGETParameter(request)); break; case POST: httpRequest = new HttpPost(url); addParams2Header(httpRequest, getGETParameter(request)); if (addParams2Entity((HttpPost) httpRequest, getGETParameter(request)) == false) return null; break; default: httpRequest = new HttpGet(url); } CloseableHttpResponse httpResponse = client.execute(httpRequest); final T response; try { Parser<? extends T, ?> parser = request.getParser(); String body = Parser.checkResponse(httpResponse); response = parser.parse(body); } finally { httpResponse.close(); } return response; } private boolean addParams2Entity(HttpPost httpRequest, List<NameValuePair> params) { MultipartEntityBuilder builder = MultipartEntityBuilder.create(); for (NameValuePair param : params) { if (param.getName().equals("file") == false) continue; File file = new File(param.getValue()); if (file.exists() == false) return false; builder.addBinaryBody(param.getName(), file); } httpRequest.setEntity(builder.build()); return true; } public void close() throws IOException { client.close(); } private static List<NameValuePair> getGETParameter(Request<?> request) { List<NameValuePair> retval = new LinkedList<NameValuePair>(); for (Parameter param : request.getParameters()) { retval.add(new BasicNameValuePair(param.getName(), param.getValue())); } return retval; } private static void addParams2Header(HttpRequestBase request, List<NameValuePair> params) { if (0 == params.size()) { return; } for (NameValuePair param : params) { request.addHeader(param.getName(), param.getValue()); } } public String getBaseURL() { return BASE_URL; } }